package kit.msc.utility;

import java.io.FileOutputStream;

import kit.msc.data.Cell;
import kit.msc.data.CellTable;
import kit.msc.data.Table;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Chapter;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Section;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class PDFWriter {

	private static String FILE;
	private static Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD);
	// private static Font redFont = new Font(Font.FontFamily.TIMES_ROMAN, 12,
	// Font.NORMAL, BaseColor.RED);
	// private static Font subFont = new Font(Font.FontFamily.TIMES_ROMAN, 16,
	// Font.BOLD);
	// private static Font smallBold = new Font(Font.FontFamily.TIMES_ROMAN, 12,
	// Font.BOLD);

	private Table table;

	public PDFWriter(Table orgTable, String file) {
		FILE = file;

		table = orgTable;

		try {
			Document document = new Document();
			PdfWriter.getInstance(document, new FileOutputStream(FILE));
			document.open();
			addMetaData(document);
			// addTitlePage(document);
			addContent(document);
			document.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private void addMetaData(Document document) {
		document.addTitle("TimeTable");
		document.addSubject("Using iText");
		document.addKeywords("Java, PDF, iText, timetable");
		document.addAuthor("Marcel Schulz");
		document.addCreator(System.getProperty("user.name"));
	}

	// private static void addTitlePage(Document document)
	// throws DocumentException {
	// Paragraph preface = new Paragraph();
	// // We add one empty line
	// addEmptyLine(preface, 1);
	// // Lets write a big header
	// preface.add(new Paragraph("Title of the document", catFont));
	//
	// addEmptyLine(preface, 1);
	// // Will create: Report generated by: _name, _date
	//	    preface.add(new Paragraph("Report generated by: " + System.getProperty("user.name") + ", " + new Date(), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	// smallBold));
	// addEmptyLine(preface, 3);
	// preface.add(new
	// Paragraph("This document describes something which is very important ",
	// smallBold));
	//
	// addEmptyLine(preface, 8);
	//
	// preface.add(new
	// Paragraph("This document is a preliminary version and not subject to your license agreement or any other agreement with vogella.com ;-).",
	// redFont));
	//
	// document.add(preface);
	// // Start a new page
	// document.newPage();
	// }

	private void addContent(Document document) throws DocumentException {
		// Anchor anchor = new Anchor("First Chapter", catFont);
		// anchor.setName("First Chapter");

		// Second parameter is the number of the chapter
		// Chapter catPart = new Chapter(new Paragraph(anchor), 1);

		// Paragraph subPara = new Paragraph("Subcategory 1", subFont);
		// Section subCatPart = catPart.addSection(subPara);
		// subCatPart.add(new Paragraph("Hello"));
		//
		// subPara = new Paragraph("Subcategory 2", subFont);
		// subCatPart = catPart.addSection(subPara);
		// subCatPart.add(new Paragraph("Paragraph 1"));
		// subCatPart.add(new Paragraph("Paragraph 2"));
		// subCatPart.add(new Paragraph("Paragraph 3"));
		//
		// // add a list
		// createList(subCatPart);
		// Paragraph paragraph = new Paragraph();
		// addEmptyLine(paragraph, 5);
		// subCatPart.add(paragraph);

		// add a table
		Chapter catPart = new Chapter(1);
		Paragraph subPara = new Paragraph("TimeTable", catFont);
		subPara.setAlignment(Element.ALIGN_CENTER);
		Section subCatPart = catPart.addSection(subPara);
		subCatPart.add(createTable(table));

		// now add all this to the document
		document.add(subCatPart);

		// Next section
		// anchor = new Anchor("Second Chapter", catFont);
		// anchor.setName("Second Chapter");

		// Second parameter is the number of the chapter
		// catPart = new Chapter(new Paragraph(anchor), 1);

		// subPara = new Paragraph("Subcategory", subFont);
		// subCatPart = catPart.addSection(subPara);
		// subCatPart.add(new Paragraph("This is a very important message"));

		// now add all this to the document
		// document.add(catPart);

	}

	private PdfPTable createTable(Table orgTable) throws BadElementException {

		Table tempTable = orgTable;
		PdfPTable pdfTable = new PdfPTable(tempTable.getWidth());

		for (int y = 0; y <= tempTable.getHeight(); y++) {
			for (int x = 0; x <= tempTable.getWidth(); x++) {
				Cell cell = tempTable.getCellAt(x, y);
				if (cell == null) {
					pdfTable.addCell(new Phrase(""));
				} else if (cell.isTable()) {
					PdfPCell pdfCell = new PdfPCell(createTable((CellTable) cell));
					pdfCell.setHorizontalAlignment(Element.ALIGN_CENTER);
					pdfTable.addCell(pdfCell);
				} else {
					PdfPCell pdfCell = new PdfPCell(new Phrase(cell.toString()));
					pdfCell.setHorizontalAlignment(Element.ALIGN_CENTER);
					pdfTable.addCell(pdfCell);
					if (cell.isLastHeader()) {
						pdfTable.setHeaderRows(1);
					}
				}
			}
		}

		return pdfTable;

	}

	// private PdfPTable creatPdfPTable(Cell tableCell) {
	//
	// CellTable cellTable = (CellTable) tableCell;
	//
	// PdfPTable pdfTable = new PdfPTable(cellTable.getWidth());
	//
	// for (int y = 0; y <= cellTable.getHeight(); y++) {
	// for (int x = 0; x <= cellTable.getWidth(); x++) {
	// Cell cell = cellTable.getCellAt(x, y);
	// if (cell instanceof CellTable) {
	// PdfPCell pdfCell = new PdfPCell(creatPdfPTable(cell));
	// pdfCell.setHorizontalAlignment(Element.ALIGN_CENTER);
	// pdfTable.addCell(pdfCell);
	// } else {
	// PdfPCell pdfCell = new PdfPCell(new Phrase(cell.toString()));
	// pdfCell.setHorizontalAlignment(Element.ALIGN_CENTER);
	// pdfTable.addCell(pdfCell);
	// if (cell.isLastHeader()) {
	// pdfTable.setHeaderRows(1);
	// }
	// }
	// }
	// }
	//
	//
	// return pdfTable;
	// }

	// private static void createList(Section subCatPart) {
	// List list = new List(true, false, 10);
	// list.add(new ListItem("First point"));
	// list.add(new ListItem("Second point"));
	// list.add(new ListItem("Third point"));
	// subCatPart.add(list);
	// }

	// private static void addEmptyLine(Paragraph paragraph, int number) {
	// for (int i = 0; i < number; i++) {
	// paragraph.add(new Paragraph(" "));
	// }
	// }

}
